/******************************************************************************/
/*                   Variabili di supporto                         */
/******************************************************************************/

var URL = {
    ajax: "http://localhost:8080/bibliOnline/ComunicaClienti",
    results: "http://localhost:8080/bibliOnline/ComunicaRisultati",
    request: "http://localhost:8080/bibliOnline/ComunicaRichiesta"
};

// Messaggi di errore relativi alla validazione dei dati 
var validation_string = {
    required_user_msg: "E' necessario inserire un nome utente",
    required_psw_msg: "E' necessario inserire una password",
    required_name_msg: "E' necessario inserire un nome",
    required_surname_msg: "E' necessario inserire un cognome",
    required_address_msg: "E' necessario inserire un indirizzo",
    required_mail_msg: "E' necessario inserire un email",
    minlength_msg: "La lunghezza minima ammessa è di 5 caratteri",
    maxlength_msg: "La lunghezza massima ammessa è di 25 caratteri",
    maxlength_add_msg: "La lunghezza massima ammessa è di 40 caratteri",
    remote_msg: "Questo nome utente è già in uso",
    mail_msg: "Inserire un email valida",
    special_char: "Non sono ammessi caratteri speciali",
    special_char_psw: "Obbigliatorie lettere maiusc. e minusc., cifre e almeno 1 di '@#$%'",
    special_char_user: "Non sono ammessi caratteri speciali (esclusi _ e hypen)"
};

    var dati_a = {
        author:0, 
        title:0,
        book_id:0
    };

// Serve per far funzionare il bottone "indietro", ripristinando la schermata dei risultati
var last_search,

// Serve per tener traccia della prenotazione che si vuole cancellare
selected_reservation,

// Serve per tener traccia del tipo di utente loggato
logged_as = null,

// Serve per tener traccia dell'utente a cui si vogliono prestare i libri
selected_user,

// Stato del libro appena selezionato
current_book_state;

/******************************************************************************/
/*                   Operazioni globali sulla pagina                          */
/******************************************************************************/

/*    Operazioni che vengono compiute all'apertura della pagina     */
$(document).ready(function()
{

    $.ajaxSetup({
        type: 'POST', 
        timeout: 5000, 
        url: URL.ajax, 
        cache: false,
        error: errore_AJAX
    });
      
    jQuery.validator.addMethod("caratterinomi",
        function( value, element )
        {
            return this.optional(element) || /[a-zA-z']{1,50}( [a-zA-z']{1,50}){0,}/.test(value);
        },
        validation_string.special_char);
        
    jQuery.validator.addMethod("caratteriusername",
        function( value, element )
        {
            return this.optional(element) || /^[a-zA-Z0-9_-]{3,25}$/.test(value);
        },
        validation_string.special_char_user);    
        
    jQuery.validator.addMethod("caratteripassword",
        function( value, element )
        {
            return this.optional(element) || /((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{5,25})/.test(value);
        },
        validation_string.special_char_psw);        
                                
    jQuery.validator.setDefaults({
        rules:
        {
            username: {
                required: true, 
                minlength: 5, 
                maxlength: 25, 
                caratteriusername:true,
                remote:
                {
                    type: 'POST', 
                    timeout: 3000, 
                    async:false, 
                    url: URL.ajax,
                    data: {
                        tipo_comando: 1, 
                        tipo_utente: function() {
                            return $("input:text[name='username']").data('tipo_utente');
                        },
                        test_username: function() {
                            return $("input:text[name='username']").val();
                        }
                    }
                }
            },
            password:   {
                required: true, 
                minlength: 5, 
                maxlength: 25, 
                caratteripassword: true
            },
            name:       {
                required: true, 
                minlength: 5, 
                maxlength: 25, 
                caratterinomi: true
            },
            surname:    {
                required: true, 
                minlength: 5, 
                maxlength: 25, 
                caratterinomi: true
            },
            mail:      {
                required: true,
                maxlength: 40,
                email: true
            },
            address:    {
                required: true,
                minlength: 5, 
                maxlength: 40,
                caratterinomi:true
            }
        },
        messages:
        {
            username:
            {
                required: validation_string.required_user_msg,
                minlength: validation_string.minlength_msg,
                maxlength: validation_string.maxlength_msg,
                remote: validation_string.remote_msg
            },
            password:
            {
                required: validation_string.required_psw_msg,
                minlength: validation_string.minlength_msg,
                maxlength: validation_string.maxlength_msg
            },
            name:
            {
                required: validation_string.required_name_msg,
                minlength: validation_string.minlength_msg,
                maxlength: validation_string.maxlength_msg
            },
            surname:
            {
                required: validation_string.required_surname_msg,
                minlength: validation_string.minlength_msg,
                maxlength: validation_string.maxlength_msg
            },
            mail:
            {
                required: validation_string.required_mail_msg,
                maxlength: validation_string.maxlength_add_msg,
                email: validation_string.mail_msg
            },
            address:	
            {
                required: validation_string.required_address_msg,
                minlength: validation_string.minlength_msg,
                maxlength: validation_string.maxlength_add_msg
            }    
        },
        errorPlacement:  function(error, element) {
            error.insertAfter(element);
        },
        highlight: function(input) {
            $(input).addClass("ui-body-e");
        },
        unhighlight: function(input) {
            $(input).removeClass("ui-body-e");
        }
    });                            

    //$(".content-primary").load("tab_menu_content/simple_search.html", inizialize_simple_search); 
    
    
    // Associo i gestori degli eventi di tipo "click" alle voci di menu
    $("#menu_login").live('vclick', click_login);
    $("#menu_registrazione").live('vclick', click_registrazione);
    $("#menu_registrazione_bibl").live('vclick', click_registrazione_bibl);
    $("#menu_cancellazione").live('vclick', click_cancellazione);
    $("#menu_ricerca_s").live('vclick', click_ricerca_s);
    $("#menu_ricerca_av").live('vclick', click_ricerca_av);
    $("#menu_prenotazione").live('vclick', click_prenotazione);
    $("#menu_richiesta").live('vclick', click_richiesta);
    $("#menu_aggiungi_libro").live('vclick', click_aggiungi_libro);
    $("#menu_presta_libri").live('vclick', click_presta_libri);
    $("#menu_restituisci_libri").live('vclick', click_restituisci_libri);
    $("#menu_prestito").live('vclick', click_prestito);
    $("#menu_commenta").live('vclick', click_commenta);
    $("#menu_visualizza_richieste").live('vclick', click_vis_richieste);
    
    
    // Nascondo le voci di menu riservate agli utenti privilegiati
    $(".std_user, .bibl_user").addClass("menu_hidden");
    
    // Associo un gestore all'evento "chiusura della pagina"
    $(window).unload(gestisci_chiusura);
    
    // Personalizzo il testo del campo ricerca
    $.mobile.listview.prototype.options.filterPlaceholder = "Cerca..."

});


/*    Gestisce la chiusura della pagina  */
function gestisci_chiusura()
{
    $.ajax({
        data: {
            tipo_comando: 4
        }
    });    
}


/*    Gestisci la disconnessione improvvisa del browser    */
function gestisci_disconnessione()
{

}



/******************************************************************************/
/*           Gestori degli eventi "click" sulle voci di menu                  */
/******************************************************************************/       
    
function click_login()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/login.html", inizialize_login);
}  


function click_logout(event)
{
    event.preventDefault();
    
    $.ajax({
        data: {
            tipo_comando: 4
        }, 
        success: good_logout
    });   
}

function click_registrazione()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/registrazione_utente.html", inizialize_registration);
}   


function click_registrazione_bibl()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/registrazione_bibliotecario.html", inizialize_registration_bibl);
}   


function click_cancellazione()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/cancellazione_utente.html", inizialize_delete);
}  


function click_ricerca_s()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/simple_search.html", inizialize_simple_search);
}  


function click_ricerca_av()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/advanced.html", inizialize_adv_search);
}

function click_prenotazione()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/prenotazione.html", execute_load_reservations);
}  


function click_richiesta()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/request_book.html", inizialize_demand);
}  

function click_aggiungi_libro()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/addBook.html", inizialize_add_book);
}  

function click_presta_libri()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/selezione_utente.html", execute_load_users);
}

function click_restituisci_libri()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/form_restituzione.html", inizialize_return);
}

function click_utente_prestito (event) {
    selected_user = event.data[1].username;
    $(".content-primary").load("tab_menu_content/form_prestito.html", inizialize_loan);
}

function click_prestito () {
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/libri_in_prestito.html", execute_load_loan);
}

function click_commenta()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/loan_list.html", inizialize_expired_loan_visualization);
} 

function click_vis_richieste()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/request_visualization.html", inizialize_request_visualization);
} 

function click_review_insert()
{
    $(".content-primary").empty();
    $(".content-primary").load("tab_menu_content/review.html", inizialize_review_insert);
} 






/******************************************************************************/
/*  Inizializza componenti relativi alle pagine invocate dalle voci di menu   */
/*                                                                            */
/*  NOTA. L'uso di trigger('create') è necessario perchè jQuery Mobile si     */
/*        accorga dell'inserimento dei nuovi elementi                         */
/******************************************************************************/

function inizialize_login()
{  
    $(".content-primary").trigger('create'); // 
    $("#submit_login").live('vclick', execute_login);
}

function inizialize_registration()
{
    $(".content-primary").trigger('create');
    $("#submit_registration").live('vclick', execute_registration);
    
    $("input:text[name='username']").data('tipo_utente',1);
    
    $("#form_user_registration").validate().form();
}

function inizialize_registration_bibl()
{
    $(".content-primary").trigger('create');
    $("#submit_registration_bibl").live('vclick', execute_registration_bibl);
    
    $("input:text[name='username']").data('tipo_utente',2);
    
    $("#form_user_bibl_registration").validate().form();
}

function inizialize_delete()
{
    $(".content-primary").trigger('create');
    $("#submit_delete").live('vclick', execute_delete);   
}

function inizialize_simple_search()
{   
    $(".content-primary").trigger('create');
    $("#submit_simple_search").live('vclick', execute_simple_search);
}

function inizialize_adv_search()
{ 
    $(".content-primary").trigger('create');
    $("#submit_advanced").live('vclick', execute_adv_search);
}

function inizialize_add_book()
{ 
    $(".content-primary").trigger('create');
    $("#submit_add_book").live('vclick', execute_add_book);
}

function inizialize_loan () {
    
    $("#loan_title").html(selected_user);
    
    // Se premo invio parte la ricerca del libro
    $("#book_code").keypress(function (event) {
        if ( event.which === 13 ) {
            event.stopPropagation();
            execute_load_book_data(event);
        }
    });
    
    // Stessa cosa se esco dalla casella 
    $("#book_code").blur(execute_load_book_data);
    
    //Se premo il pulsante di submit invio l'elenco della prenotazione
    $('#submit_loan_books').click(execute_loan_books);

    $(".content-primary").trigger('create');
}

function inizialize_return () {

    // Se premo il pulsante parte la restituzione 
    $("#submit_return_books").click(execute_return);
    
    // Stessa cosa se premo invio
    $("#book_code").keypress(function (event) {
        if ( event.which === 13 ) {
            event.stopPropagation();
            execute_return(event);
        }
    });
    
    $(".content-primary").trigger('create');
}

function inizialize_demand()
{ 
    $(".content-primary").trigger('create');
    $("#submit_request").live('vclick', execute_demand);
}

function inizialize_expired_loan_visualization()
{ 
    $.ajax({
        url: URL.results, 
        data: {
            tipo_comando: 20
        },
        success: good_load_review,
        dataType:'json'
    });
}    

function inizialize_request_visualization()
{ 
    $.ajax({
        url: URL.request, 
        data: {
            tipo_comando: 16
        },
        success: good_request_visualization,
        dataType:'json'
    });
}

function inizialize_confirm_demand()
{ 
    $(".content-primary").trigger('create');
    $("#demand_confirm").live('vclick', execute_demand_confirm);
    $("#demand_confirm_no").live('vclick', click_richiesta);
}

function inizialize_review_insert()
{ 
    $(".content-primary").trigger('create');
    $("#submit_review_insert").live('vclick', execute_review_insert);
    $("#exit_review_insert").live('vclick', click_commenta);
}



/******************************************************************************/
/*          Gestori dei click sui bottoni di submit dei vari form             */
/******************************************************************************/    
    
function execute_simple_search(event) {
    event.preventDefault();
    
    console.log(event);
    
    var dati = {
        title:0, 
        author:0
    };

    dati.title = $("input:text[name='title']").val();
    dati.author = $("input:text[name='author']").val();
    
    $.ajax({
        url: URL.results, 
        data: {
            tipo_comando: 6,
            title: dati.title, 
            author: dati.author
        },
        success: append_result_list,
        dataType:'json'
    });

}

function execute_adv_search(event)
{
    event.preventDefault();
    
    var dati = {
        title:0,
        author:0,
        publisher:0,
        genre:0,
        year:0,
        state:0
    };

    dati.title = $("input:text[name='title']").val();
    dati.author = $("input:text[name='author']").val();
    dati.publisher = $("input:text[name='publisher']").val();
    dati.genre = $("input:text[name='genre']").val();
    dati.year = $("input:text[name='year']").val();
    dati.state = $(":input[name='state']").val();
  
    $.ajax({
        url: URL.results, 
        data: {
            tipo_comando: 7, 
            title: dati.title, 
            author: dati.author, 
            publisher: dati.publisher, 
            genre: dati.genre, 
            year: dati.year, 
            state: dati.state
        },
        success: append_result_list,
        dataType:'json'
    });

}


function execute_login(event)
{
    event.preventDefault();
    
    var dati = {
        username:0,
        password:0
    };

    dati.username = $("input:text[name='username']").val();
    dati.password = $("input:password[name='password']").val();
      
    $.ajax({
        url: URL.ajax, 
        data: {
            tipo_comando: 2, 
            login_username: dati.username,
            login_password: dati.password
        },
        success: good_response_login,
        dataType:'json'
    });

}

function execute_registration(event)
{
    event.preventDefault();
    	
    if($("#form_user_registration").validate().form()==false)
        return;
    
    var dati = {
        username:0, 
        password:0,
        name:0,
        surname:0,
        mail:0,
        address:0
    };

    dati.username = $("input:text[name='username']").val();
    dati.password = $("input:text[name='password']").val();
    dati.name = $("input:text[name='name']").val();
    dati.surname = $("input:text[name='surname']").val();
    dati.mail = $("input:text[name='mail']").val();
    dati.address = $("input:text[name='address']").val();
    
    $.ajax({
        url: URL.ajax, 
        data: {
            tipo_comando: 0, 
            reg_username: dati.username, 
            reg_password: dati.password, 
            reg_firstname: dati.name, 
            reg_lastname: dati.surname, 
            reg_address: dati.address,
            reg_email: dati.mail
        },
        success: good_registration
    });

} 

function execute_registration_bibl(event)
{
    event.preventDefault();
    
    if($("#form_user_bibl_registration").validate().form()==false)
        return;
    
    var dati = {
        username:0, 
        password:0,
        name:0,
        surname:0,
        address:0
    };

    dati.username = $("input:text[name='username']").val();
    dati.password = $("input:text[name='password']").val();
    dati.name = $("input:text[name='name']").val();
    dati.surname = $("input:text[name='surname']").val();
    dati.address = $("input:text[name='address']").val();
    
    $.ajax({
        url: URL.ajax, 
        data: {
            tipo_comando: 5, 
            reg_username: dati.username, 
            reg_password: dati.password, 
            reg_firstname: dati.name, 
            reg_lastname: dati.surname, 
            reg_address: dati.address
        },
        success: good_registration,
        dataType:'json'
    });

} 

function execute_delete(event)
{
    event.preventDefault();
    
    var dati = {
        username:0, 
        password:0
    };

    dati.username = $("input:text[name='username']").val();
    dati.password = $("input:text[name='password']").val();
    
    $.ajax({
        url: URL.ajax, 
        data: {
            tipo_comando: 3, 
            rem_username: dati.username, 
            rem_password: dati.password
        },
        success: good_delete, 
        dataType:'json'
    });

} 

function execute_add_book(event)
{
    event.preventDefault();
    
    var dati = {
        author:0, 
        title:0,
        publisher:0,
        edition:0,
        genre:0,
        year:0
    };
    
    dati.author = $("input:text[name='author']").val();
    dati.title = $("input:text[name='title']").val();
    dati.publisher = $("input:text[name='publisher']").val();
    dati.edition = $("input:text[name='edition']").val();
    dati.genre = $("input:text[name='genre']").val();
    dati.year = $("input:text[name='year']").val();
    
    $.ajax({
        url:        "http://localhost:8080/bibliOnline/addBook.jsp",
        data: {
            author:     dati.author,
            title:      dati.title,
            publisher:  dati.publisher,
            edition:    dati.edition,
            genre:      dati.genre,
            year:       dati.year
        },
        dataType:   "json",
        success:    good_addbook
    });
} 



function execute_reservation(event) {

    last_search = event.data[0];
    var bookData = event.data[1];
    
    $.ajax({
        url: URL.results, 
        data: {
            tipo_comando: 8,
            id: bookData.id
        },
        success: good_reservation,
        dataType:'json'
    });
}

function execute_load_reservations() {
    $.ajax({
        url: URL.results, 
        data: {
            tipo_comando: 9
        },
        success: good_load_reservations,
        dataType:'json'
    });
}

/* 
 * Cancella la prenotazione
 */
function execute_remove_reservation () {
    $.ajax({
        url: URL.results, 
        data: {
            tipo_comando: 10,
            id: selected_reservation
        },
        success: good_remove_reservation,
        dataType:'json'
    });
}

function execute_load_users () {
    $.ajax({
        url: URL.results, 
        data: {
            tipo_comando: 11
        },
        success: good_load_users,
        dataType:'json'
    });
}

function execute_demand(event)
{
    event.preventDefault();
      
    dati_a.author = $("input:text[name='author']").val();
    dati_a.title = $("input:text[name='title']").val();
    
    $.ajax({
        url: URL.request,
        data: {
            tipo_comando: 21,
            author:     dati_a.author,
            title:      dati_a.title,
            bypass: false
        },
        success:    good_demand,
        dataType:   "json"
    });
} 

function execute_demand_confirm(event)
{
    event.preventDefault();
    
    $.ajax({
        url: URL.request,
        data: {
            tipo_comando: 21,
            author:     dati_a.author,
            title:      dati_a.title,
            bypass: true
        },
        success:    good_demand_confirm,
        dataType:   "json"
    });
}

function execute_review_insert(event)
{
    event.preventDefault();
    
    var dati = {
        text:0,
        vote:0
    };
    
    
    dati.text = $("#form-review").val();
    dati.vote = $("#slider-review-vote").val();
    
    $.ajax({
        url: URL.results,
        data: {
            tipo_comando: 17,
            text_review:     dati.text,
            vote:      dati.vote,
            book_id: dati_a.book_id
        },
        success:    good_review_insert,
        dataType:   "json"
    });
} 




function execute_load_book_data (event) {
    event.preventDefault();
    
    var value = event.target.value,
        total = $('form li').length;
    
    // Pulisco il campo
    $("#book_code").val("");
    
    // Controllo che il campo non sia vuoto, che non ci sia il libro già selezionato
    // e che non sia già raggiunto il nro max di libri
    if (value != "" && $('#' + value).length === 0 && total < 2) {

        $.ajax({
            url: URL.results, 
            data: {
                tipo_comando: 12,
                id: value
            },
            success: good_load_book_data,
            dataType:'json'
        });
    }
}

function execute_loan_books (event) {
    event.preventDefault();
    
    // Recupero i libri da prestare
    var list = $("form li"),
        books = "";

    
    // Trovo le id dei libri selezionati
    for (var i=0; i<list.length; ++i) {
        books += list[i].id + " ";
    }
    
    // Controllo se ci sono libri
    if (books != "") {
        $.ajax({
            url: URL.results, 
            data: {
                tipo_comando: 13,
                customer: selected_user,
                books: books
            },
            success: good_loan_books,
            dataType:'json'
        });
    }
}

function execute_load_loan () {
    $.ajax({
        url: URL.results, 
        data: {
            tipo_comando: 14
        },
        success: good_load_loan,
        dataType:'json'
    });
}


function execute_return (event) {
    event.preventDefault();
    
    var value = $("#book_code").val();
    
    // Pulisco il campo
    $("#book_code").val("");
    
    // Controllo che il campo non sia vuoto
    if (value != "") {

        $.ajax({
            url: URL.results, 
            data: {
                tipo_comando: 15,
                book_id: value
            },
                success: good_return,
            dataType:'json'
        });
    }
 }
 
/******************************************************************************/
/*              Gestori delle risposte AJAX ricevute dal server               */
/******************************************************************************/   

function good_response_login(json)
{
    var result_html =
    '<div class="ui-body-b formdiv">\n\
        <div id="remove_reservation_result"></div>\n\
        </div>';
    
    $(".content-primary").empty();
    $(".content-primary").html(result_html);
    
    if(json.success == false) {
        $("#remove_reservation_result").append('<h3>Errore di autenticazione</h3><br><p>' + json.message + '</p>');
        return;
    }
        
    if(json.message=="CUSTOMER" || json.message=="LIBRARIAN")
    {
        $("#remove_reservation_result").append('<p>Login effettuato con successo</p>');
        
        $('#menu_login').find("a").text("Logout");
        $('#menu_login').die('vclick',click_login );
        $("#menu_login").live('vclick', click_logout);
        
        if(json.message== "CUSTOMER") {
            $(".std_user").removeClass("menu_hidden");
            $('#menu_list_divider').html(json.username + ' (UTENTE)');
            logged_as = 'CUSTOMER';
        }
        
        if(json.message== "LIBRARIAN") {
            $(".bibl_user").removeClass("menu_hidden");
            $('#menu_list_divider').html(json.username + ' (BIBLIOTECARIO)');
            logged_as = 'LIBRARIAN';
        }
    }

}


/* Invocato nel caso il server risponda alla richiesta relativa alla disconnessione  */
function good_logout()
{
    $('#menu_list_divider').html('Accedi');
    $('#menu_login').find("a").text("Login");
    $('#menu_login').die('vclick', click_logout);
    $("#menu_login").live('vclick', click_login);
    
    $(".std_user, .bibl_user").addClass("menu_hidden");
    
    logged_as = null;
    
    $(".content-primary").empty();
}


function good_registration(json)
{
    if(json.success == false)
        return;
      
    $("<p>"+ json.message + "</p>").replaceAll('#form_user_registration');
    $(".content-primary").trigger('create');

}


function good_delete(json)
{
    if(json.success == false)
        return;
      
    $("<p>"+ json.message + "</p>").replaceAll('#form_user_delete');
    $(".content-primary").trigger('create');
}


/**
 * Funzione che crea una lista dinamica, contenente i risultati della ricerca
 * Usata sia per la ricerca semplice che per quella avanzata
 * 
 * @param json: oggetto contenente un array di libri
 */
function append_result_list(json) {

    // Codice html per inizializzare la lista dinamica
    // Se uso la funzione .html la grafica non funziona
    var list_html =
    '<div>\n\
            <ul id="dynamic_list" data-role="listview" data-inset="true">\n\
                <li data-role ="list-divider">\n\
                    <h1>Risultati ricerca</h1>\n\
                </li>\n\
            </ul>\n\
        </div>';
    
    // Cancello il form di ricerca
    $(".content-primary").empty();
    $(".content-primary").html(list_html);
    
    if(json.isErrorMessage) {
        $("#dynamic_list").append('<li>' + json.errorMessage + '</li>');
    }
    else {
    
        // Itero sul contenuto dell'oggetto json, che contiene il risultato della ricerca
        // Inserisco nome e autore in un campo lista, per ogni libro, che appendo
        var id, name;
        for(var libro in json.books){
            id = 'book_' + json.books[libro].id;
            
            $("#dynamic_list").append('<li><a id=' + id + ' href="#"><h3>' + json.books[libro].title + '</h3><p>' + json.books[libro].author + '</p></li>');
            $('#'+id).bind("click", [json, json.books[libro]], show_book_details);
        }
    }
    
    $(".content-primary").trigger('create');
}

/*
 *  imposto le caselle di testo associate ad ogni campo
 *  e all'intero form in accordo coi messaggi ricevuti;
 *  
 *  ogni messaggio e' una coppia (id, value) in cui
 *  id e' l'identificatore del corrispondente tag nella pagina html
 *  e value e' il valore del messaggio;
 *  in questo modo posso associare ogni messaggio d'errore
 *  alla casella di input che l'ha generato
 */
function good_addbook(json)
{
    $("#author").html("");
    $("#title").html("");
    $("#publisher").html("");
    $("#edition").html("");
    $("#genre").html("");
    $("#year").html("");
    $("#response").html("");
    
    //  associo ogni messaggio al proprio elemento html
    //      il campo id del messaggio contiene
    //      l'identificatore del corrispondente tag div
    //      nella pagina addBook.html
    //      es.: "author", "title"...
    for(var i = 0; i < json.messagesCount; i++)
        $("#"+json.messages[i].id).html("<label class=\"error\">"+json.messages[i].value+"</label>");
    
    //  se tutto e' andato a buon fine svuoto il form
    if(json.successful == true)
        $("#form-reset").trigger("click");
}

function good_reservation(json) {
    var result_html =
    '<div class="ui-body-b formdiv">\n\
    <div id="reservation_result"></div>\n\
    <a id="details_back_button" href="#" data-role="button" data-inline="true" data-theme="c">Indietro</a>\n\
    </div>';
    
    // Cancello il form di ricerca
    $(".content-primary").empty();
    $(".content-primary").html(result_html);
    
    if(json.isErrorMessage) {
        $("#reservation_result").append('<p>' + json.errorMessage + '</p>');
    }
    else {
        $("#reservation_result").append('<p> La prenotazione a nome <i>' + json.username + '</i> ha avuto successo.'
            + "<br>Tempo previsto perché il libro torni disponibile: " + json.remainingTime + " secondi.</p>");
    }
    
    $('#details_back_button').bind("click", last_search, function(event){
        append_result_list(event.data);
    });
    
    $(".content-primary").trigger('create');
}

/* 
 * Caricamento della lista dei libri prenotati
 */
function good_load_reservations (json) {
    if(json.isErrorMessage) {
        $("#dynamic_list").append('<li>' + json.errorMessage + '</li>');
    }
    else {
        // Itero sul contenuto dell'oggetto json, che contiene il risultato della ricerca
        // Inserisco nome e autore in un campo lista, per ogni libro, che appendo
        var id;
        for(var libro in json.books){
            id = 'book_' + json.books[libro].id;
            
            // Apre una finestra di conferma al clic sul pulsante di rimozione
            $("#dynamic_list").append('<li><a href="#"><h3>' + json.books[libro].title 
                + '</h3><p>' + json.books[libro].author + '</p></a><a id=remove_booking_' + id 
                + ' data-rel="dialog" href="tab_menu_content/confirm_remove_reservation.html">Cancella prenotazione</a></li>');
            $('#remove_booking_' + id).bind("click", [json, json.books[libro]], function (event) {
                selected_reservation = event.data[1].id;
            });
        }
    }
    $(".content-primary").trigger('create');
}

function good_load_review (json) 
{
    if(json.isErrorMessage) 
    {
        $("#dynamic_list").append('<li>' + json.errorMessage + '</li>');
    }
    else 
    {
        // Itero sul contenuto dell'oggetto json, che contiene il risultato della ricerca
        // Inserisco nome e autore in un campo lista, per ogni libro, che appendo
        var id,name;
        for(var libro in json.books)
        {
            id = 'book_' + json.books[libro].id; 
            dati_a.book_id=json.books[libro].id;
            
            if(json.books[libro].vote==0)
            {    
                $("#dynamic_list").append('<li><a id=' + id + ' href="#"><h3>' + json.books[libro].title + '</h3><p>' + json.books[libro].author + '</p></li>');
                $('#'+id).bind("click", [json, json.books[libro]], click_review_insert);
            }
            else 
                $("#dynamic_list").append('<li><h3>' + json.books[libro].title + '</h3><p>' + json.books[libro].author + '</p></li>');    
        }
    }
    $(".content-primary").trigger('create');
}

/*
 * Chiamata se la prenotazione è stata rimossa correttamente
 * Visualizza un messaggio di conferma
 */
function good_remove_reservation (json) {
    var result_html =
    '<div class="ui-body-b formdiv">\n\
    <div id="remove_reservation_result"></div>\n\
    </div>';
    
    // Cancello il form di ricerca
    $(".content-primary").empty();
    $(".content-primary").html(result_html);
    
    if(json.isErrorMessage) {
        $("#remove_reservation_result").append('<p>' + json.errorMessage + '</p>');
    }
    else {
        $("#remove_reservation_result").append('<p> La prenotazione è stata rimossa con successo.</p>');
    }
}

function good_load_users (json) {
    
    if(json.isErrorMessage) {
        $("#select_user_list").append('<p>' + json.errorMessage + '</p>');
    }
    else {
        for(var i in json.users){
            $("#select_user_list").append('<li><a id="user_' + i + '" href="#">'
                + json.users[i].username + '</a></li>');
            $('#user_' + i).bind("click", [json, json.users[i]], click_utente_prestito);
        }
    }
    
    $(".content-primary").trigger('create');
}

function good_load_book_data (json) {
    
    if(json.isErrorMessage) {
    //$("#books_to_loan_list").append('<p>' + json.errorMessage + '</p>');
    }
    else {
        var id = json.books[0].id,
            title = json.books[0].title;
        $("#books_to_loan_list").append('<li id="' + id + '" class="book_to_loan" data-icon="delete"><a href="#">' + title + '</a></li>').listview('refresh');
        $('#' + id).bind('click', id, remove_book_data);
    }
    
    $(".content-primary").trigger('create');
}

function good_loan_books (json) {
    var result_html =
    '<div class="ui-body-b formdiv">\n\
    <div id="loan_books_result"></div>\n\
    </div>';
    
    // Cancello il form di ricerca
    $(".content-primary").empty();
    $(".content-primary").html(result_html);
    
    if(json.isErrorMessage) {
        $("#loan_books_result").append('<p>' + json.errorMessage + '</p>');
    }
    else {
        $("#loan_books_result").append('<p>Il prestito è stato registrato con successo.</p>');
    }
}

function good_load_loan (json) {
    if(json.isErrorMessage) {
        $("#dynamic_list").append('<li>' + json.errorMessage + '</li>');
    }
    else {
        // Itero sul contenuto dell'oggetto json, che contiene il risultato della ricerca
        // Inserisco nome e autore in un campo lista, per ogni libro, che appendo
        for(var libro in json.books){

            // Apre una finestra di conferma al clic sul pulsante di rimozione
            $("#dynamic_list").append('<li><h3>' + json.books[libro].title 
                + '</h3><p>' + json.books[libro].author + '</p></li>');
        }
    }
    
    $(".content-primary").trigger('create');
}

function good_return (json) {
    if(json.isErrorMessage) {
        $("#books_returned").html('<p>' + json.errorMessage + '</p>');
    }
    else {
        $("#books_returned").html('<p>Il libro è stato restituito con successo</p>');
    }
    
    $(".content-primary").trigger('create');
}



function good_review_insert (json) 
{    
    if(json.isErrorMessage ) 
    {
        $("<p>"+ json.errorMessage + "</p>").replaceAll('#form_review_insert');
    }
    
    $("<p>"+ json.message + "</p>").replaceAll('#form_review_insert');
    $(".content-primary").trigger('create');
}

function good_reviews_visualization(json) 
{    
    //reviews_visual
    if(json.isErrorMessage ) 
    {
        //$("#reviews_visual").append("<p>"+ json.errorMessage + "</p>");
         $("#reviews_visual").append('<div class="ui-bar ui-bar-e"><h3>' + json.errorMessage + '</h3></div>');
         $(".content-primary").trigger('create');
        return;
    }
    
    for(var libro in json.books)
    {           
        $("#reviews_visual").append('<div data-role="collapsible" data-content-theme="c" data-theme="e">' 
                                    + '<h3>Autore Commento: ' + json.books[libro].username_comment + '</h3>' 
                                    + '<h3>Commento: </h3>' 
                                    +'<p id="comm">' + json.books[libro].comment + '</p>' 
                                    + '<div id="div_anti_bug"><h3></h3></div>' 
                                    + '<h3>Voto: </h3>' 
                                    +'<p>' + json.books[libro].vote + '</p>' 
                                    + '</div>');                      
        }
    
    $(".content-primary").trigger('create');
}


function good_demand (json) 
{    
    if(json.isErrorMessage ) 
    {
       if(json.errorMessage=="sicuro")
       {
          $("#demand_book").load("tab_menu_content/confirm_demand.html", inizialize_confirm_demand);  
       }    
       else
           $("<p>"+ json.errorMessage + "</p>").replaceAll('#form_book_request');
    }
    $("<p>"+ json.message + "</p>").replaceAll('#form_book_request');
    $(".content-primary").trigger('create');
}

function good_demand_confirm (json) 
{
    if(json.isErrorMessage ) 
    {
        $("<p>"+ json.errorMessage + "</p>").replaceAll('#form_book_request_conf');
    }
    
    $("<p>"+ json.message + "</p>").replaceAll('#form_book_request_conf');
    $(".content-primary").trigger('create');
}

function good_request_visualization (json) 
{    
    if(json.isErrorMessage) 
    {
        $("#dynamic_list").append('<li>' + json.errorMessage + '</li>');
    }
    else {
        // Itero sul contenuto dell'oggetto json, che contiene il risultato della ricerca
        // Inserisco nome e autore in un campo lista, per ogni libro, che appendo
        var id;
        for(var richiesta in json.requests)
        {
            id = 'book_' + json.requests[richiesta].id;
            
            $("#dynamic_list").append('<li><h3>' 
                                      + "Titolo: " + json.requests[richiesta].title 
                                      + "   Autore: " + json.requests[richiesta].author 
                                      + '</h3><p>' 
                                      +  'Username: ' + json.requests[richiesta].username 
                                      + '</p></li>');
        }
    }
    
    $(".content-primary").trigger('create');
}


/*    Invocata nel caso il server non risponda ad una richiesta  */
function errore_AJAX()
{
    console.log("Chiamata AJAX fallita");
}


/**
 * Visualizza i dettagli di un libro.
 */
function show_book_details(event) {
    
    // Codice html per la pagina dei dettagli
    // Se uso la funzione .html la grafica non funziona
    var details_html = '\
        <div id="details_div" class="ui-body-b formdiv">\n\
            <div>\n\
                <h3 id="details_header"></h3>\n\
            </div>\n\
            <div>\n\
                <p id="details_title"></p>\n\
                <p id="details_author"></p>\n\
                <p id="details_publisher"></p>\n\
                <p id="details_year"></p>\n\
                <p id="details_genre"></p>\n\
                <p id="details_state"></p>\n\
                <div data-role="collapsible" data-role="collapsible-set" data-theme="e" id=reviews_visual>\n\
                </div>\n\
            <br>\n\
            </div>\n\
            <a id="details_back_button" href="#" data-role="button" data-inline="true" data-theme="c">Indietro</a>\n\
        </div>\n\
    ';
     
    // Recupero i dati (json serve per ricaricare la pagina precedente)
    var bookData = event.data[1];
    var json = event.data[0];
        
    // Cancello il form di ricerca
    $(".content-primary").empty();
    $(".content-primary").html(details_html);
    
    // Inserisco i dettagli del libro negli appositi paragrafi
    $("#details_header").html('Dettagli per <i>' + bookData.title + '</i>');
    $("#details_title").html('<b>Titolo: </b>' + bookData.title);
    $("#details_author").html('<b>Autore: </b>' + bookData.author);
    $("#details_publisher").html('<b>Editore: </b>' + bookData.publisher);
    $("#details_year").html('<b>Anno: </b>' + bookData.year);
    $("#details_genre").html('<b>Genere: </b>' + bookData.genre);
    
    // Segnalo la disponibilità del libro
    if(bookData.state=="AVAILABLE") {
        $("#details_state").html('<b>Stato: </b><b style="color:green">DISPONIBILE</b>');
    } else if (bookData.state=="RESERVED") {
        $("#details_state").html('<b>Stato: </b><b style="color:red">PRENOTATO</b>');
    } else {
        $("#details_state").html('<b>Stato: </b><b style="color:red">IN PRESTITO</b>');
    }
    
    // Aggiungo il bottone Prenota se l'utente è un cliente
    if(logged_as === 'CUSTOMER') {
        $('#details_div').append('<a id="details_reserve_button" href="#" data-role="button" data-inline="true" >Prenota</a>');
        $('#details_reserve_button').bind("click", [json, bookData], execute_reservation);
    }
    
    // Richiedo il caricamento dei commenti inseriti dagli utenti 
    $.ajax({
        url: URL.results, 
        data: {
            tipo_comando: 18, 
            book_id: bookData.id
        },
        success: good_reviews_visualization,
        dataType:'json'
    });

    
    
    // Al click sul bottone di ritorno, richiamo la funzione di creazione lista
    $('#details_back_button').bind("click", json, function(event){
        append_result_list(event.data);
    });
    
    $(".content-primary").trigger('create');
}

function remove_book_data (event) {
    $('#' + event.data).remove();
}
